\chapter{Architecture et Documentation}
\paragraph{}Notre architecture a été conçue de manière à être utilisable comme une bibliothèque de haut niveau. La convolution est créée de manière simple, il n'y a besoin que de lui passer la matrice et le diviseur servant à remettre la valeur d'un pixel dans ses bornes. De la même manière, l'appel à la convolution ne nécessite que l'image d'origine et l'image de sortie.
\paragraph{}Pour cela on définit une classe générique et abstraite pour la convolution, en tant que modèle que doivent respecter ses différentes variantes.
\section{Diagramme}
\paragraph{}Le diagramme suivant suffit à exprimer entièrement l'architecture générale du système.
\begin{figure}[H]
  \centering
  \includegraphics[scale=0.37]{images/diagramme.png}
  \caption{Schéma de l'architecture du système}
  \label{fig:archiSys}
\end{figure}
\paragraph{}L'appel à convolution est défini par le fichier configure qui va choisir quelle convolution appeler en fonction du matériel disponible sur la machine.
\paragraph{}Ainsi le calcul de la convolution peut être fait en séquentiel, en multithreads ou en CUDA.
\section{Architecture}
Chaque classe a une fonction spécifique. Au centre du projet, la partie traitant la convolution, avec une spécialisation pour le séquentiel, le multithreads et le CUDA. Une classe est chargée de découper les données en répondant aux spécificités du calcul sur carte graphique. La gestion de la matrice de convolution et le chargement / enregistrement de l'image sont également dans des classes séparées.
\paragraph{}Pour nous concentrer sur la partie CUDA, au c{\oe}ur du projet, nous avons choisi d'utiliser certaines bibliothèques externes afin de gérer quelques tâches annexes.
\paragraph{}Le chargement et l'enregistrement de l'image sont assurés par la bibliothèque DevIL. Celle-ci a l'avantage de gérer de nombreux formats d'image de manière transparente, nous permettant de ne manipuler que la matrice de pixels résultant du chargement. L'enregistrement de l'image s'entend selon le même principe.
\paragraph{}La parallélisation pour la partie multithreads est assistée par libpthread. Le choix de cette bibliothèque est motivé par le fait que nous la connaissions déjà. Cela nous a permis de gagner du temps par rapport à la prise en main d'autres bibliothèques telles que OpenMP.
\paragraph{}La figure suivante illustre le fonctionnement des différentes architectures pour le traitement d'une entrée particulière. Tout cela sera expliqué plus précisément dans les parties suivantes.
\begin{figure}[H]
  \centering
  \includegraphics[scale=0.3]{images/resume.png}
  \caption{Vision globale de l'architecture}
  \label{fig:archiSys}
\end{figure}

\section{Documentation}
\paragraph{}La documentation est essentielle pour une bibliothèque afin de spécifier clairement l’utilisation des fonctions. Nous avons donc pris soin de la rendre simple d'utilisation et complète. Afin de la générer, nous avons utilisé Doxygen. Au format HTML, elle est fournie avec une indexation des espaces de nommage, des classes et des fichiers.
